1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
转发:
request.getRequestDispatcher("success.jsp").forward(request,response);

在服务器组件收到用户请求后。经过它的处理后有传递给了另一个组件。不修改用户的请求码。各组件处理完之后在返回给用户,例如主页面的框架。

用户请求---->服务器---->组件1---->组件2---->服务器---->用户

(请求不变)

重定向:
response.sendRedirect("success.jsp");

在服务器组件收到用户请求后。经过处理修改用户请求。在返回给用户。这样用户再次使用这个请求就会被动的使用新的请求了。(重定向一般是为了防止用户提交完数据后点浏览器刷新或点后退之后产生重复提交)

用户请求---->服务器---->组件---->服务器---->用户---->新的请求

(修改用户请求)

springMVC 中的应用

springMVC中常用到redirect来实现重定向,但是使用场景各有需求,重定向中可能需要在url中拼接参数,可能需要返回model。springMVC用RedirectAttributes 解决问题。

首先,在controller中重定向用以下方式:

1
return  “redirect:/index”;

此时只是重定向到简单的地址;

使用RedirectAttributes 来设置重定向页面的参数。 springMVC会自动拼接URL。

该对象的两个方法:

1
2
3
4
5
6
7
8
1:addAttribute
@RequestMapping("save")
public String save(User user, RedirectAttributes redirectAttributes)
{
redirectAttributes.addAttribute("param","value1");
return "redirect:/index";
}
//跳转到index时,会在URL拼接 ? param=value1.
1
2
3
4
5
6
7
8
2:addFlashAttribute
@RequestMapping("/save")
public String save(User user,RedirectAttributes redirectAttributes)
{
redirectAttribute.addFlashAttributes("param","value1");
return "redirect:/index";
}
//跳转save后,可以在index对应的模板中通过表达式,比如jsp中jstl的${param} ,获取返回值,该值实际上保存在session中,并且会在下次重定向时删除。

服务端跳转和客户端跳转

服务端跳转指的是地址栏内容不变,客户端浏览器的地址栏不会显示目标地址的URL。 所以跳转与否,客户端是不知道的,属于一次request。

客户端跳转指的是地址栏的内容发生了改变,客户端向服务器发送请求后,服务端再给客户端一个响应,然后客户端根据服务端给的响应中的URL再次向服务端发送请求,所以是两次请求。第二次跳转的时候,已经出了request的属性范围了。

如果使用的是服务器端跳转,则执行到跳转语句时会立刻进行跳转,如果是客户端跳转,则是在整个页面执行完后才执行跳转。

java中的服务端跳转

1
2
request.getRequestDispatcher("sucess.jsp").forward(request,response)
<jsp:forward>

客户端跳转

1
response.sendRedirect("fail.jsp") 所有页面执行完之后再进行跳转

跳转方法

1
2
3
4
1: redirect方式
response.sendRedirect("/a.jsp") 页面路径是相对路径,可以将页面跳转到任何页面,不局限在本web应用中。
2: forward方式
request.getRequestDispatcher("/a.jsp").forward(request,response) 只能跳转到本应用页面。